package com.fbs.wowo.finance.service;

import com.fbs.wowo.exception.CreateEntityFailedException;
import com.fbs.wowo.exception.InputVerifyFailedException;
import com.fbs.wowo.finance.entity.Payment;
import com.fbs.wowo.finance.vo.Buy;
import com.fbs.wowo.finance.vo.BuyEssay;
import com.fbs.wowo.finance.vo.WXAppPayResult;
import com.fbs.wowo.manage.vo.Balance;
import com.google.zxing.WriterException;

import java.io.IOException;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.util.List;

public interface PayService {
    /**
     * 我的购买
     * @param userId            用户id
     * @return BuyEssay
     * @throws InputVerifyFailedException
     */
    List<BuyEssay> buyList(String userId) throws InputVerifyFailedException;

    /**
     * 我的购买
     * @param userId            用户id
     * @param productCategory   分类
     * @return Buy
     * @throws InputVerifyFailedException
     *
     * @deprecated 暂时用不上，只有图文音频 使用 {@code buyList} 代替
     */
    List<Buy> buyList(String userId, Byte productCategory) throws InputVerifyFailedException;
    /**
     * 我的 订单列表
     * @param buyerId   买家id
     * @param pageNo    页码
     * @param pageSize  大小
     * @return          订单
     */
    List<Payment> orderList(String buyerId, Integer pageNo, Integer pageSize);
    /**
     * 查询是否付过费
     * @param buyerId          用户id
     * @param productId        产品id
     * @param productCategory  打赏或其他
     * @return 1 没付过 2 付过
     */
    Integer paid(String buyerId, String productId, Byte productCategory);
    /**
     * 查询余额
     * @param userId 用户id
     * @return       余额
     */
    Balance balance(String userId);
    /**
     * 余额支付 + 密码校验
     * @param password         支付密码
     * @param buyerId          用户id
     * @param fee              金额
     * @param productId        产品id
     * @param productType      产品类型
     * @param productCategory  打赏或其他
     * @return                 支付状态
     * @throws CreateEntityFailedException  异常
     * @throws InputVerifyFailedException   密码错误
     */
    String submitorderBalanceVerifyPass(String password, String buyerId, BigDecimal fee, String productId, Byte productType, Byte productCategory) throws CreateEntityFailedException, InputVerifyFailedException;
    /**
     * 余额支付
     * @param buyerId          用户id
     * @param fee              金额
     * @param productId        产品id
     * @param productType      产品类型
     * @param productCategory  打赏或其他
     * @return                 支付状态
     * @throws CreateEntityFailedException
     */
    String submitorderBalance(String buyerId, BigDecimal fee, String productId, Byte productType, Byte productCategory) throws CreateEntityFailedException;
    /**
     * 微信扫码支付 NATIVE
     * @param ip                ip
     * @param buyerId           买家id
     * @param fee               费用
     * @param productId         产品id
     * @param productType       产品类型
     * @param productCategory   产品分类
     * @param outputStream      输出到屏幕的输出流
     * @throws WriterException  异常
     * @throws IOException      异常
     */
    void submitorderWXNative(String ip, String buyerId, BigDecimal fee, String productId, Byte productType, Byte productCategory, OutputStream outputStream) throws WriterException, IOException;
    /**
     * 微信App支付 APP
     * @param ip                ip
     * @param buyerId           买家id
     * @param fee               费用
     * @param productId         产品id
     * @param productType       产品类型
     * @param productCategory   产品分类
     * @return                  返回给app端结果
     */
    WXAppPayResult submitorderWXApp(String ip, String buyerId, BigDecimal fee, String productId, Byte productType, Byte productCategory);

    /**
     * 微信异步通知
     * @param data  微信传递xml数据
     * @return      通知微信成功信息
     * @throws CreateEntityFailedException 异常
     */
    String wxNotice(String data) throws CreateEntityFailedException;

    /**
     * 主动查询订单号
     * @param orderNo 订单号
     * @return        交易结果
     *                  NOTPAY,     // 未支付
     *                  CLOSED,     // 关闭交易
     *                  PAYERROR,   // 支付错误
     *                  SUCCESS,    // 支付成功
     *                  REFUND;     // 退款
     */
    String syn(String orderNo);
}
